// Selfinfowidget.h
// Created by Limou on 24-8-28.
// 可以根据一个登录用户信息, 制作一个登录用户名片

#ifndef FRONTEND_SELFINFOWIDGET_HPP
#define FRONTEND_SELFINFOWIDGET_HPP

#include <QWidget>
#include <QDialog>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QCursor>
#include <QGridLayout>
#include "../../common/Common.hpp"
#include "../../model/UserModel.hpp"

// >>> class SelfInfoWidget begin >>>
namespace chat_system::subassembly {
    class SelfInfoWidget : public QDialog {
    Q_OBJECT
    private:
        // 部件
        QPushButton* avatarBtn_; // 用户头像按钮

        QLabel* userIdTag_; // 用户 "账号" 标签
        QLabel* userIdLab_; // 用户账号内容标签

        QLabel* nickNameTag_; // 用户 "昵称" 标签
        QLabel* nickNameLab_; // 用户昵称内容标签
        QLineEdit* nickNameEdit_; // 用户昵称编辑框
        QPushButton* nickNameModifyBtn_; // 修改用户昵称按钮
        QPushButton* nickNameSubmitBtn_; // 提交用户昵称按钮

        QLabel* personalSignatureTag_; // 用户 "签名" 标签
        QLabel* personalSignatureLab_; // 用户签名内容标签
        QLineEdit* personalSignatureEdit_; // 用户签名编辑框
        QPushButton* personalSignatureModifyBtn_; // 修改用户签名按钮
        QPushButton* personalSignatureSubmitBtn_; // 提交用户签名按钮

        QLabel* phoneNumberTag_; // 用户 "电话" 标签
        QLabel* phoneNumberLab_; // 用户电话内容标签
        QLineEdit* phoneNumberEdit_; // 用户电话编辑框
        QPushButton* phoneNumberModifyBtn_; // 修改用户电话按钮
        QPushButton* phoneNumberSubmitBtn_; // 提交用户电话按钮

        // NOTE: 下面的组件只有在修改电话号码时才会被显示出来
        QLabel* verifyCodeTag_; // 用户 "验证码" 标签
        QLineEdit* verifyCodeEdit_; // 用户验证码编辑框
        QPushButton* verifyCodeBtn_; // 获取验证码按钮

        // 数据
        model::UserModel user_; // 对应用户

    public:
        // 构造方法
        explicit SelfInfoWidget(const model::UserModel& user = model::UserModel())
                : QDialog()
                , avatarBtn_(new QPushButton(this))
                , userIdTag_(new QLabel(this))
                , userIdLab_(new QLabel(this))
                , nickNameTag_(new QLabel(this))
                , nickNameLab_(new QLabel(this))
                , nickNameEdit_(new QLineEdit(this))
                , nickNameModifyBtn_(new QPushButton(this))
                , nickNameSubmitBtn_(new QPushButton(this))
                , personalSignatureTag_(new QLabel(this))
                , personalSignatureLab_(new QLabel(this))
                , personalSignatureEdit_(new QLineEdit(this))
                , personalSignatureModifyBtn_(new QPushButton(this))
                , personalSignatureSubmitBtn_(new QPushButton(this))
                , phoneNumberTag_(new QLabel(this))
                , phoneNumberLab_(new QLabel(this))
                , phoneNumberEdit_(new QLineEdit(this))
                , phoneNumberModifyBtn_(new QPushButton(this))
                , phoneNumberSubmitBtn_(new QPushButton(this))
                , verifyCodeTag_(new QLabel(this))
                , verifyCodeEdit_(new QLineEdit(this))
                , verifyCodeBtn_(new QPushButton(this))
                , user_(user) {
            this->setElement(); // 设置组件
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置信号槽

            // 设置具体内容
            avatarBtn_->setIcon(user_.getUserAvatarIco());
            userIdLab_->setText(user_.getUserId());
            nickNameLab_->setText(user_.getUserNickName());
            personalSignatureLab_->setText(user_.getUserPersonalSignature());
            phoneNumberLab_->setText(user_.getUserPhoneNumber());
        }

        // 析构方法
        ~SelfInfoWidget() override = default;

    private:
        // 设置组件方法
        void setElement() {
            // 设置整体部件的属性
            this->setFixedSize(400, 180);
            this->setWindowTitle("个人名片");

            QIcon windowIcon(":/window/window_main/logo.png");
            if (windowIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): windowIcon is null"); }
            this->setWindowIcon(windowIcon);
            this->setAttribute(Qt::WA_DeleteOnClose); // NOTE: 设置窗口被关闭时自动释放, 避免点击过多造成内存泄漏
            this->move(QCursor::pos()); // 默认移动到鼠标的位置

            // 提前设置 tag 的尺寸
            QSize tagSize(50, 30);

            // 提前设置 lab 的尺寸
            int labSize = 30;

            // 提前设置 mod 按钮的尺寸
            QSize modBtnAndSubBtnSize(20, 20);

            // 提前设置 sub 按钮的尺寸
            QSize subBtnAndSubBtnSize(20, 20);

            // 提前设置 mod 按钮的图标
            auto modifyBtnIcon = QIcon(":subassembly/modify.png");
            if (modifyBtnIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): modifyBtnIcon is null"); }

            // 提前设置 sub 按钮的图标
            auto submitBtnIcon = QIcon(":subassembly/submit.png");
            if (submitBtnIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): submitBtnIcon is null"); }

            // [头像]
            // 设置用户头像按钮
            auto size = QSize(50, 50);
            avatarBtn_->setFixedSize(size);
            avatarBtn_->setIconSize(size);
            avatarBtn_->setStyleSheet(
                    "QPushButton {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
            );

            // [账户]
            // 设置用户 "账号" 标签
            userIdTag_->setText("账户");
            userIdTag_->setFixedSize(tagSize);
            userIdTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            // 设置用户账号内容标签
            userIdLab_->setFixedHeight(labSize);
            userIdLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // [昵称]
            // 设置用户 "昵称" 标签
            nickNameTag_->setText("昵称");
            nickNameTag_->setFixedSize(tagSize);
            nickNameTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置用户昵称内容标签
            nickNameTag_->setFixedHeight(labSize);
            nickNameLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // 设置用户昵称编辑框
            nickNameEdit_->setFixedHeight(labSize);
            nickNameEdit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            nickNameEdit_->hide(); // 暂时不显示出来

            // 设置修改用户昵称按钮
            nickNameModifyBtn_->setFixedSize(modBtnAndSubBtnSize);
            nickNameModifyBtn_->setIconSize(modBtnAndSubBtnSize);
            nickNameModifyBtn_->setIcon(modifyBtnIcon);

            // 设置提交用户昵称按钮
            nickNameSubmitBtn_->setFixedSize(subBtnAndSubBtnSize);
            nickNameSubmitBtn_->setIconSize(subBtnAndSubBtnSize);
            nickNameSubmitBtn_->setIcon(submitBtnIcon);
            nickNameSubmitBtn_->hide(); // 暂时不显示出来

            // [签名]
            // 设置用户 "签名" 标签
            personalSignatureTag_->setText("签名");
            personalSignatureTag_->setFixedSize(tagSize);
            personalSignatureTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置用户签名内容标签
            personalSignatureLab_->setFixedHeight(labSize);
            personalSignatureLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // 设置用户签名编辑框
            personalSignatureEdit_->setFixedHeight(labSize);
            personalSignatureEdit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            personalSignatureEdit_->hide(); // 暂时不显示出来
            // 设置修改用户签名按钮
            personalSignatureModifyBtn_->setFixedSize(modBtnAndSubBtnSize);
            personalSignatureModifyBtn_->setIconSize(modBtnAndSubBtnSize);
            personalSignatureModifyBtn_->setIcon(modifyBtnIcon);

            // 设置提交用户签名按钮
            personalSignatureSubmitBtn_->setFixedSize(subBtnAndSubBtnSize);
            personalSignatureSubmitBtn_->setIconSize(subBtnAndSubBtnSize);
            personalSignatureSubmitBtn_->setIcon(submitBtnIcon);
            personalSignatureSubmitBtn_->hide(); // 暂时不显示出来

            // [电话]
            // 设置用户 "电话" 标签
            phoneNumberTag_->setText("电话");
            phoneNumberTag_->setFixedSize(tagSize);
            phoneNumberTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置用户电话内容标签
            phoneNumberLab_->setFixedHeight(labSize);
            phoneNumberLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            // 设置用户电话编辑框
            phoneNumberEdit_->setFixedHeight(labSize);
            phoneNumberEdit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

            phoneNumberEdit_->hide(); // 暂时不显示出来
            // 设置修改用户电话按钮
            phoneNumberModifyBtn_->setFixedSize(modBtnAndSubBtnSize);
            phoneNumberModifyBtn_->setIconSize(modBtnAndSubBtnSize);
            phoneNumberModifyBtn_->setIcon(modifyBtnIcon);

            // 设置提交用户电话按钮
            phoneNumberSubmitBtn_->setFixedSize(subBtnAndSubBtnSize);
            phoneNumberSubmitBtn_->setIconSize(subBtnAndSubBtnSize);
            phoneNumberSubmitBtn_->setIcon(submitBtnIcon);
            phoneNumberSubmitBtn_->hide(); // 暂时不显示出来

            // [验证码]
            // 设置用户 "验证码" 标签
            verifyCodeTag_->setText("验证码");
            verifyCodeTag_->setFixedSize(tagSize);
            verifyCodeTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            verifyCodeTag_->hide(); // 暂时不显示出来
            // 设置用户验证码内容标签
            verifyCodeEdit_->setFixedHeight(labSize);
            verifyCodeEdit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            verifyCodeEdit_->hide(); // 暂时不显示出来
            // 设置用户验证码编辑框
            verifyCodeEdit_->setFixedWidth(160); // 暂时不显示出来
            verifyCodeEdit_->setStyleSheet(
                    "QLineEdit {"
                    "color: white;"
                    "background-color: black;"
                    "border-radius: 5px;"
                    "}");
            verifyCodeEdit_->hide(); // 暂时不显示出来
            // 设置获取验证码按钮
            verifyCodeBtn_->setFixedSize(QSize(30, 20));
            verifyCodeBtn_->setText("获取");
            QFont font = verifyCodeBtn_->font();
            font.setPointSize(10); // 设置字体大小为 10, TODO: 这里不能使用 style, 很奇怪
            verifyCodeBtn_->setFont(font);
            verifyCodeBtn_->hide(); // 暂时不显示出来
        }

        // 设置组件样式方法
        void setElementStyle() {
            this->setStyleSheet(
                    "QDialog {"
                    "background-color: rgb(254, 254, 254);"
                    "}"
            );

            // 提前设置好 tag 的样式
            QString tagStyle =
                    "QLabel {"
                    "font-size: 14px;"
                    "font-weight: 800;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            // 提前设置好 lab 的样式
            QString labStyle =
                    "QLabel {"
                    "font-size: 14px;"
                    "font-weight: 500;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            // 提前设置 mod 按钮的样式
            QString modBtnStyle =
                    "QPushButton {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(210, 210, 210);"
                    "}";

            // 提前设置 sub 按钮的样式
            QString SubBtnStyle =
                    "QPushButton {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(210, 210, 210);"
                    "}";

            // 提前设置 edit 编辑区的样式
            QString editStyle =
                    "QLineEdit {"
                    "color: white;"
                    "border: none;"
                    "background-color: black;"
                    "border-radius: 5px;"
                    "padding-left: 2px;"
                    "}";

            userIdTag_->setStyleSheet(tagStyle);
            userIdLab_->setStyleSheet(labStyle);

            nickNameTag_->setStyleSheet(tagStyle);
            nickNameLab_->setStyleSheet(labStyle);
            nickNameEdit_->setStyleSheet(editStyle);
            nickNameModifyBtn_->setStyleSheet(modBtnStyle);
            nickNameSubmitBtn_->setStyleSheet(SubBtnStyle);

            personalSignatureTag_->setStyleSheet(tagStyle);
            personalSignatureLab_->setStyleSheet(labStyle);
            personalSignatureEdit_->setStyleSheet(editStyle);
            personalSignatureModifyBtn_->setStyleSheet(modBtnStyle);
            personalSignatureSubmitBtn_->setStyleSheet(SubBtnStyle);

            phoneNumberTag_->setStyleSheet(tagStyle);
            phoneNumberLab_->setStyleSheet(labStyle);
            phoneNumberEdit_->setStyleSheet(editStyle);
            phoneNumberModifyBtn_->setStyleSheet(modBtnStyle);
            phoneNumberSubmitBtn_->setStyleSheet(SubBtnStyle);

            verifyCodeTag_->setStyleSheet(tagStyle);
            verifyCodeEdit_->setStyleSheet(labStyle);
            verifyCodeBtn_->setStyleSheet(modBtnStyle);
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 设置布局管理器
            auto layout = new QGridLayout();
            layout->setHorizontalSpacing(10);
            layout->setVerticalSpacing(3);
            layout->setContentsMargins(20, 0, 20, 0);
            this->setLayout(layout);
            layout->addWidget(avatarBtn_, 0, 0, 4, 1);

            layout->addWidget(userIdTag_, 0, 1);
            layout->addWidget(userIdLab_, 0, 2);

            layout->addWidget(nickNameTag_, 1, 1);
            layout->addWidget(nickNameLab_, 1, 2);
            layout->addWidget(nickNameEdit_, 1, 2);
            layout->addWidget(nickNameModifyBtn_, 1, 3);
            layout->addWidget(nickNameSubmitBtn_, 1, 3);

            layout->addWidget(personalSignatureTag_, 2, 1);
            layout->addWidget(personalSignatureLab_, 2, 2);
            layout->addWidget(personalSignatureEdit_, 2, 2);
            layout->addWidget(personalSignatureModifyBtn_, 2, 3);
            layout->addWidget(personalSignatureSubmitBtn_, 2, 3);

            layout->addWidget(phoneNumberTag_, 3, 1);
            layout->addWidget(phoneNumberLab_, 3, 2);
            layout->addWidget(phoneNumberEdit_, 3, 2);
            layout->addWidget(phoneNumberModifyBtn_, 3, 3);
            layout->addWidget(phoneNumberSubmitBtn_, 3, 3);

            layout->addWidget(verifyCodeTag_, 4, 1);
            layout->addWidget(verifyCodeEdit_, 4, 2);
            layout->addWidget(verifyCodeBtn_, 4, 3);
        }

        // 设置信号槽
        void setElementSignalSlot() {
            // 切换为修改按钮
            connect(nickNameModifyBtn_, &QPushButton::clicked, this, [=]() {
                // 切换按钮
                nickNameModifyBtn_->hide();
                nickNameSubmitBtn_->show();

                // 覆盖部件
                nickNameLab_->hide();
                nickNameEdit_->show();

                // 初始文本
                nickNameEdit_->setText(nickNameLab_->text());
            });
            connect(personalSignatureModifyBtn_, &QPushButton::clicked, this, [=]{
                // 切换按钮
                personalSignatureModifyBtn_->hide();
                personalSignatureSubmitBtn_->show();

                // 覆盖部件
                personalSignatureLab_->hide();
                personalSignatureEdit_->show();

                // 初始文本
                personalSignatureEdit_->setText(personalSignatureLab_->text());
            });
            connect(phoneNumberModifyBtn_, &QPushButton::clicked, this, [=](){
                // 切换按钮
                phoneNumberModifyBtn_->hide();
                phoneNumberSubmitBtn_->show();

                // 覆盖部件
                phoneNumberLab_->hide();
                phoneNumberEdit_->show();

                // 初始文本
                phoneNumberEdit_->setText(phoneNumberLab_->text());

                // 显示验证
                verifyCodeTag_->show();
                verifyCodeEdit_->show();
                verifyCodeBtn_->show();
            });

            // 切换为提交按钮
            connect(nickNameSubmitBtn_, &QPushButton::clicked, this, [=](){
                // 切换按钮
                nickNameSubmitBtn_->hide();
                nickNameModifyBtn_->show();

                // 覆盖部件
                nickNameEdit_->hide();
                nickNameLab_->show();

                // 修改文本
                QString nickNameText = nickNameEdit_->text();
                if (!nickNameText.isEmpty()) {
                    // TODO: 检验提交表单
                    nickNameLab_->setText(nickNameText);
                }

                // 更新数据
                // TODO: 异步更新远端服务器
            });
            connect(personalSignatureSubmitBtn_, &QPushButton::clicked, this, [=](){
                // 切换按钮
                personalSignatureSubmitBtn_->hide();
                personalSignatureModifyBtn_->show();

                // 覆盖部件
                personalSignatureEdit_->hide();
                personalSignatureLab_->show();

                // 修改文本
                QString personalSignatureText = personalSignatureEdit_->text();
                if (!personalSignatureText.isEmpty()) {
                    // TODO: 检验提交表单
                    personalSignatureLab_->setText(personalSignatureText);
                }

                // 更新数据
                // TODO: 异步更新远端服务器
            });
            connect(phoneNumberSubmitBtn_, &QPushButton::clicked, this, [=](){
                // 切换按钮
                phoneNumberSubmitBtn_->hide();
                phoneNumberModifyBtn_->show();

                // 覆盖部件
                phoneNumberEdit_->hide();
                phoneNumberLab_->show();

                // 隐藏验证
                verifyCodeTag_->hide();
                verifyCodeEdit_->hide();
                verifyCodeBtn_->hide();

                // 校验凭证
                // TODO: 只有验证码通过的时候才可以进行修改, 否则弹出修改失败的提示

                // 修改文本
                QString phoneNumberText = phoneNumberEdit_->text();
                if (!phoneNumberText.isEmpty()) {
                    // TODO: 检验提交表单
                    phoneNumberLab_->setText(phoneNumberText);
                }

                // 更新数据
                // TODO: 异步更新远端服务器
            });

            // 点击获取验证码或检验验证码
            connect(verifyCodeBtn_, &QPushButton::clicked, this, [=](){
                if (verifyCodeBtn_->text() == "获取") {
                    // 修改按钮文字
                    verifyCodeBtn_->setText("提交");

                    // 开始倒计时
                    // TODO: 异步显示验证码有效的倒计时

                    // 获取验证码
                    // TODO: 获取验证码
                }
                else if (verifyCodeBtn_->text() == "提交") {
                    // 修改按钮文字
                    verifyCodeBtn_->setText("获取");

                    // 等待检测中
                    // TODO: 异步显示旋转等待图标

                    // 检验验证码
                    // TODO: 检验验证码
                }
            });
        }
    };
} // namespace chat_system::subassembly end
// <<< class SelfInfoWidget end <<<

#endif // FRONTEND_SELFINFOWIDGET_HPP
